s3fsでAmazon S3をファイルシステムとして扱う | アドカレ2013 : CFn #7
こんにちは。たけかわです。『アドベントカレンダー2013:AWS CloudFormationビッグバンテンプレート』7日目です。
昨日6日目は、横田慎介さんのZabbix編でした。本日はs3fsです。
s3fsについて
s3fsは、オープンソースのFUSEファイルシステムで、Amazon S3をファイルシステムのように扱うために利用します。s3fsについては、植木さんが書いたs3fsを使ってEC2からS3をマウントしたときにうまくいかなくて調べた事まとめがよくまとまっていますので、はじめての方は一読いただければとおもいます。
s3fsの最新版は1.74です。このバージョンではIAMロールにも対応しているので、EC2上でIAMロールを割り当てればアクセスキー等を設定しなくても使えるようになりました。便利ですね。
パッケージとしては提供されていませんので必要パッケージを導入後、コードをコンパイルしてインストールを行ない、さらに設定をする必要があります。ちょっと面倒ですよねー。ということでCloudFormationの出番です。
テンプレートの説明
このCFnテンプレート以下の作業をおこないます。
- S3にアクセスできるIAMロールを作成します
- 標準のAmazon AMIでインスタンスをたちあげます
- s3fsに必要なパッケージをインストールします
- s3fsをコンパイルしてインストールします。
- s3fsコマンドを実行し、指定されたバケットを/mnt/3にマウントします
以下に起動時のパラメータを示します。
InstanceType | 起動するEC2インスタンスのタイプです。デフォルトはt1.microです。 |
KeyName | EC2にSSHログインするためのKeyPair名を指定します。 |
VpcId | インスタンスの所属するVPCのIDを指定します。例 :vpc-XXXXXXXX |
SubnetId | VPCのSubnetIDを指定します。例 :例 :subnet-XXXXXXXX |
BucketName | マウントしたいS3のバケット名を指定します。 |
CloudFormationのスタックがCompleteになったあと10分程待ってから起動したEC2にsshしてみてください。/mnt/s3
にバケットの内容がみえていたら成功です。
takekawa_mac$ ssh ec2-user@XXX.XXX.XXX.XXX The authenticity of host 'XXX.XXX.XXX.XXX (XXX.XXX.XXX.XXX)' can't be established. RSA key fingerprint is 3c:2c:39:ed:98:03:04:fe:b5:08:62:e2:af:72:40:29. Are you sure you want to continue connecting (yes/no)? yes Warning: Permanently added 'XXX.XXX.XXX.XXX' (RSA) to the list of known hosts. __| __|_ ) _| ( / Amazon Linux AMI ___|\___|___| https://aws.amazon.com/amazon-linux-ami/2013.09-release-notes/ [ec2-user@ip-172-31-10-186 ~]$ ls /mnt/s3 TEST.MOV cfn_s3fs.template new folder [ec2-user@ip-172-31-10-186 ~]$
コマンドラインからの実行
awscliを用いるとコマンドラインからスタックの作成ができます。デバッグ時等GUIでパラメータを何度も入れるのは面倒です。今回のテンプレートですとこんな感じで実行できます。
takekawa_mac$ CFN_BUCKETNAME=MYBUCKETNAME takekawa_mac$ CFN_SUBNETID=subnet-XXXXXXX takekawa_mac$ CFN_VPCID=vpc-XXXXXXX takekawa_mac$ CFN_KEYNAME=MYKEYNAME takekawa_mac$ CFN_STACKNAME=s3fs_test takekawa_mac$ takekawa_mac$ aws cloudformation create-stack --disable-rollback \ --region ap-northeast-1 --stack-name $CFN_STACKNAME --parameters \ ParameterKey=BucketName,ParameterValue=$CFN_BUCKETNAME \ ParameterKey=SubnetId,ParameterValue=$CFN_SUBNETID \ ParameterKey=VpcId,ParameterValue=$CFN_VPCID \ ParameterKey=KeyName,ParameterValue=$CFN_KEYNAME \ --template-url https://cm-public-cfn-templates.s3-ap-northeast-1.amazonaws.com/cfn_s3fs/cfn_s3fs-1.0-SNAPSHOT.template A client error (ValidationError) occurred when calling the CreateStack operation: 1 validation error detected: Value 's3fs_test' at 'stackName' failed to satisfy constraint: Member must satisfy regular expression pattern: [a-zA-Z][-a-zA-Z0-9]*
シェル変数にパラメータ引数等を設定し、awsコマンドでスタックを作成します。この例ですと最後にエラーになっています。スタック名が制約にしたがっていない(アンダースコアがはいっている)というエラーですね。で、そこを修正して実行するにはこんな感じです。
takekawa_mac$ CFN_STACKNAME=s3fsTEST takekawa_mac$ aws cloudformation create-stack --disable-rollback \ --region ap-northeast-1 --stack-name $CFN_STACKNAME --parameters \ ParameterKey=BucketName,ParameterValue=$CFN_BUCKETNAME \ ParameterKey=SubnetId,ParameterValue=$CFN_SUBNETID \ ParameterKey=VpcId,ParameterValue=$CFN_VPCID \ ParameterKey=KeyName,ParameterValue=$CFN_KEYNAME \ --template-url https://cm-public-cfn-templates.s3-ap-northeast-1.amazonaws.com/cfn_s3fs/cfn_s3fs-1.0-SNAPSHOT.template { "StackId": "arn:aws:cloudformation:ap-northeast-1:314132709601:stack/s3fsTEST/86c768e0-5ed4-11e3-8524-50fa01768096" } takekawa_mac$
改善すべき点
以下のような改善すべき点があります。
- IAMロールがS3の全てにアクセスできるという権限になっています。実際の利用ではこの部分絞るようにすべきです。
- FTPサーバーも一緒に設定すれば、S3をFTPでアクセスできるようになり便利な気がします。
- サブネットIDを指定すればVPC IDも一意に定まる気がするのですが、VPC IDの取得方法がわかりませんでした。
ということで GitHubよりフォークして頂いて進化させて頂ければと思います。プルリクエストされたらとても喜びます。
まとめ
手でやるとちまちまといろいろインストールする必要があるので面倒なのですが、CloudFormationで簡単にs3fsインスタンスが作れます。明日、8日目は福田さんです。おたのしみに。